Adding some more judges, here and there.
[andmenj-acm.git] / SPOJ / EPALIN - 4103. Extend to Palindrome / epalin.2.cpp
blob84c8bd297cfa2fb0e36e31be0863ec39c1d11c44
1 // Andrés Mejía
2 using namespace std;
3 #include <algorithm>
4 #include <iostream>
5 #include <iterator>
6 #include <numeric>
7 #include <sstream>
8 #include <fstream>
9 #include <cassert>
10 #include <climits>
11 #include <cstdlib>
12 #include <cstring>
13 #include <string>
14 #include <cstdio>
15 #include <vector>
16 #include <cmath>
17 #include <queue>
18 #include <deque>
19 #include <stack>
20 #include <list>
21 #include <map>
22 #include <set>
24 #define foreach(x, v) for (typeof (v).begin() x=(v).begin(); x !=(v).end(); ++x)
25 #define For(i, a, b) for (int i=(a); i<(b); ++i)
26 #define D(x) cout << #x " is " << x << endl
28 const double EPS = 1e-9;
29 int cmp(double x, double y = 0, double tol = EPS) {
30 return (x <= y + tol) ? (x + tol < y) ? -1 : 0 : 1;
33 const int MAXN = 100005 * 2;
35 int p[MAXN];
37 int main(){
38 string s;
39 s.reserve(MAXN);
40 while (getline(cin, s)) {
41 printf("%s", s.c_str());
42 int n = s.size();
43 s = s + "$" + s;
44 reverse(s.begin(), s.begin() + n);
46 p[0] = 0;
47 for (int i = 1; i < 2 * n + 1; ++i) {
48 p[i] = p[i - 1];
49 while (p[i] > 0 and s[i] != s[p[i]]) p[i] = p[p[i] - 1];
50 if (s[i] == s[p[i]]) p[i]++;
53 for (int i = p[2 * n]; i < n; ++i) {
54 putchar(s[i]);
56 puts("");
58 return 0;